package cn.bonoon.kernel.descriptors;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * <pre>
 * 对实体中属性的定义，属性的定义完整的包括，私有属性的定义，get/set方法的定义
 * </pre>
 * @author jackson
 *
 */
public interface ClassPropertyAccessor {
	/**
	 * 定义的属性的名称
	 * @return
	 */
	String getName();
	/**
	 * 定义的属性的类型
	 * @return
	 */
	Class<?> getType();
	/**
	 * 属性类型对应的类名
	 * @return
	 */
	String getTypeName();
	/**
	 * 对属性进行设值的set方法
	 * @return
	 */
	Method setter();
	/**
	 * 能属性进行取值的get方法
	 * @return
	 */
	Method getter();
	/**
	 * <pre>
	 * 取得定义在属性上的注解；
	 * 是否允许定义在get/set方法上
	 * </pre>
	 * @param annotationClass
	 * @return
	 */
	<T extends Annotation> T getAnnotation(Class<T> annotationClass);
	/**
	 * 判断指定的注解是否存在
	 * @param annotationClass
	 * @return
	 */
	<T extends Annotation> boolean isAnnotationPresent(Class<T> annotationClass);
	/**
	 * 该字段所属的类，可能是数据库实体也可能是embedded实体
	 * @return
	 */
	Class<?> getOwnerClass();
	
	Field getField();
}
